
/**
 * 
 * @author Claudio
 *
 */

public interface IJogo {
	
	/**
	 * Invariantes:
	 * 
	 * - Cada carta so pode está em um lugar. Mão de um jogador ou deck ou descarte.
	 * - Se a mão do jogador estiver vazia o partida termina.
	 * 
	 */
	
	
	

	/**
	 * Metodo responsável por definir a ordem inicial do jogo.
	 * 
	 * Pre-condição:
	 *	- Jogo deve possuir ao menos 2 jogadores.
	 * 
	 * Pós-Condição:
	 *	- Ordem dos jogadores.
	 * 
	 */
	public void determinaOrdem();
	
	
	/**
	 * Metodo responsável por distribuir as cartas entre os jogadores.
	 * 
	 * Pre-condição:
	 *	- O jogo deve possuir 2 a 7 jogadores.
	 *	- Essa operação deve ser chamada no inicio do jogo, onde o deck está completo.
	 * 
	 * Pós-condição:
	 * 	- Cada jogodor terá 7 cartas na mão.
	 * 
	 */
	public void distribuirMaos();
	
	/**
	 * Metodo responsável por validar uma jogada.
	 * 
	 * Pre-condição
	 *	- Inicio da jogada de cada jogador.
	 * 
	 * Pós-condição
	 *  - A mão do jogador está atualizada com as cartas válidas para jogada.
	 * 
	 * @return
	 */
	public void checkCartaValida(Jogador jogador);
	
	/**
	 * Metodo responsável por ativar os efeitos de uma carta no jogo.
	 * 
	 * Pre-condição:
	 *	- Jogador ter realizado jogada.
	 *	- Carta de descarte ser de efeito.
	 * 
	 * Pós-condição:
	 *  - Skip: Pula o turno do proximo jogador.
	 *  - Reverse: Inverte a ordem dos jogadores.
	 *  - Draw Two: Obriga o proximo jogador a puxar duas cartas.
	 *  - Draw Four:  
	 *  - Wild: 
	 *  
	 * @param carta
	 */
	public void jogar(int indexCarta);
	
	/**
	 * Metodo responsável por definir o vencedor da rodada.
	 * 
	 * Pre-condição
		- Jogador não possuir cartas na mão.
	 * 
	 * Pos-condilção
		- Nome do jogador vencendor.
	 * 
	 * @return
	 */
	public boolean checkVencedor();
	
	/**
	 * Metodo responsável por fazer a soma dos pontos dos jogadores 
	 * 
	 * Pre-condição
		- Possuir algum vencendor.
	 * 
	 */
	public void adicionarPontos();
	
	/**
	 * Metodo responsável por executar as operações de reinicio de partida.
	 * 
	 */
	public void iniciarNovoJogo();
	
	
}
